/* 
    泛型工具类：
        1. Partial<MyProps>： 将一个已有的类型转为属性可选的类型,原有 interface 不变
        2. ReadOnly<MyProps>: 将一个已有的类型转为属性只读的类型,原有 interface 不变
        3. Pick<MyProps, "id" | "children">: 将一个已有的类型转为指定属性的类型，多个属性之间用 | 分割，原有 interface 不变
        4. Record<Keys,Type> 创建一个类型，键为keys，类型为 Type，多个键之间用 | 分割，如 Record<"a"|"b"|"c",string[]>
*/
interface MyProps {
    id: string
    children: number[]
}

/* Partial<MyProps> */
type PartialProps = Partial<MyProps>;
// MyProps 本身没有变 
const myProps1: MyProps = {
    id: "",
    children: []
}
// Partial 创建出的 interface 的属性是可选的。
const partialProps1: PartialProps = {//不加属性也不会报错，加了也可以，因为属性是可选的
    id: "",
    children: []
}

/* ReadOnly<<MyProps> */
type ReadonlyProps = Readonly<MyProps>;
const myReadonlyProps: ReadonlyProps = {
    id: "1",
    children: []
}

myReadonlyProps.id = "123"; // 不能修改，因为是只读属性

/* Pick<MyProps, "id" | "children"> */
type PickProps = Pick<MyProps, "children">;//多个属性之间用 | 分割，如  "id" | "children" 
const myPickProps: PickProps = {
    children: []
}

/* Record<Keys,Type> */
type RecordObj = Record<"a" | "b" | "c", string[]>;
// 和下面定义对象的方式等价
type RecordObj2 = {
    "a": string[],
    "b": string[],
    "c": string[],
}
const myRecordObj: RecordObj = {
    a: ["aa", "bb"],
    b: ["bb", "cc"],
    c: ["cc", "dd"]
}